/*
 * Per ora questa classe non viene usata
 */
package agenda;

import agenda.entityes.TelNumber;
import java.util.Arrays;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author manu
 */
public class NumTableModel extends AbstractTableModel {

    /**
     * Nomi delle 2 colonne presenti nella tabella.
     */
    String[] colNames = {"Tipo", "Numero"};
    /**
     * Array che mantiene i dati della tabella.
     *
     * I valori delle due colonne per una determinata riga vengono memorizzati
     * in un elemento TelNumber dato che all'interno di esso è presente sia il
     * numero di telefono che il tipo di numero.
     * 
     * FIXME come per EntryListMdel la scelta di usare TelNumber per mantenere i dati, lega troppo la parte
     * grafica e il database sottostante. Trovare un altro modo.
     */
    /* TelNumber[] numbers = new TelNumber[0]; */
    String numbers[][] = new String[0][0];

    public int getRowCount() {
        return numbers.length;
    }

    public int getColumnCount() {
        return 2;
    }

    /**
     * Ritorna il valore di una cella.
     *
     * @param rowIndex
     * @param columnIndex
     * @return il valore richiesto
     */
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (rowIndex >= numbers.length) {
            throw new IllegalArgumentException("colonna non presenente nel modello");
        }

        if (columnIndex > 1) {
            throw new IllegalArgumentException("il massimo indice di colonna è 1");
        }

        if (columnIndex == 0) {
            return numbers[rowIndex][0];
        }

        return numbers[rowIndex][1];
    }

    /**
     * Aggiunge una riga alla fine del modello.
     *
     * Aggiunge una riga contenente il numero passato come argomento al modello.
     * Se {@code  num} &egrave. {@code  null}, aggiunge una riga vuota.
     *
     * @param type tipo numero
     * @param num numero da aggiungere
     */
    public void addRow(String type, String num) {
        int len = numbers.length;

        /*
         * al padding con null fino alla nuova dimensione ci pensa copyOf
         */
       numbers = Arrays.copyOf(numbers, len + 1);

       int i = len -1;
        if (type != null && num != null) {
            
            numbers[i] = new String[2];
            numbers[i][0] = type;
            numbers[i][1] = num;
        }
        // len e' steto decrementato eh
        fireTableRowsInserted(i, i);
    }

    public void insertRow(int i, TelNumber num) {
        throw new UnsupportedOperationException("da implementare");
    }

    /**
     * Elimina una riga dal modello.
     * 
     * Se {@code row} &egrave. minore di zero, elimina l,ultimo elemento del modello,
     * altrimenti verr&agrave. eliminata quella il cui indice nell'array dei numeri è uguale 
     * a {@code  row}.
     * @param row  indice riga da eliminare
     */
    public void removeRow(int row) {
        int len = numbers.length;
        
        // se row < 0 elimina l'ultima riga
        if (row < 0) {
            numbers = Arrays.copyOf(numbers, len - 1);
            fireTableRowsDeleted(len-1, len-1);
            return;
        } 
        String tmp[][] = new String[len - 1][];
        
        // copia la prima meta' dell'array
        System.arraycopy(numbers, 0, tmp, 0, row);
        // copia la seconda meta' dell'array
        System.arraycopy(numbers, row + 1, tmp, row , (len -1 - row));
        
        numbers = tmp;
        
        // notifica della modifica dei dati
        fireTableRowsDeleted(row, row);
    }
}
